/*!
* EURO INFORMATICA
* http://informatica.euroeducation.ro/
* Copyright 2013, Euro Education Federation
* Author: Marius Ionescu
*
* --- OOP JS BaseClass ---
*/

var reflection = {};

(function(){
	var initializing = false, fnTest = /xyz/.test(function(){xyz;}) ? /\b_super\b/ : /.*/;
	this.BaseClass = function(){};
   
	BaseClass.extend = function(prop, ref_name) {
		if(ref_name)
			reflection[ref_name] = BaseClass;
			
		var _super = this.prototype;

		initializing = true;
		var prototype = new this();
		initializing = false;
		 
		for (var name in prop) {
		    prototype[name] = typeof prop[name] == "function" && typeof _super[name] == "function" && fnTest.test(prop[name]) ?
			    (function(name, fn) {
				    return function() {
					    var tmp = this._super;
					    this._super = _super[name];
					    var ret = fn.apply(this, arguments);        
					    this._super = tmp;

					    return ret;
				    };
			    })(name, prop[name]) :
			    prop[name];
		}
		 
		function BaseClass() {
			if ( !initializing && this.init )
				this.init.apply(this, arguments);
		}

		BaseClass.prototype = prototype;
		BaseClass.prototype.constructor = BaseClass;
		BaseClass.extend = arguments.callee;
		 
		return BaseClass;
	};
})();

(function(){
    var BaseObject = function () { };
    BaseObject.extend = function (prop, ref_name) {
        baseThis: null;
    };
});